﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace AudiPyme.DAL
{
    public static class ControlesEmpresaFactory
    {
        //Método que actualiza la respuesta a un control por parte de una empresa
        public static void ActualizarControlesEmpresa(int IdEmpresa, int IdControl, String Valor)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            var ControlEmpresa = (from ContrEmp in agenteBD.ControlesEmpresaEstablecer
                                  where ContrEmp.IdEmpresa == IdEmpresa && ContrEmp.IdControl == IdControl
                                  select ContrEmp).Single();
            ControlEmpresa.Valor = Valor;
            agenteBD.SaveChanges();
        }

        //Devuelve una lista del número de respuestas a los controles de una empresa, agrupados por las mismas
        public static List<int> NumeroControlesTipoRespuesta(int IdEmpresa)
        {
            List<int> NumContrResp = new List<int>();
            ModeloContainer agenteBD = new ModeloContainer();
            int NumSI = (from SiContr in agenteBD.ControlesEmpresaEstablecer
                         where SiContr.IdEmpresa == IdEmpresa && SiContr.Valor == "SI"
                         select SiContr).Count();
            NumContrResp.Insert(0, NumSI);
            int NumNO = (from NoContr in agenteBD.ControlesEmpresaEstablecer
                         where NoContr.IdEmpresa == IdEmpresa && NoContr.Valor == "NO"
                         select NoContr).Count();
            NumContrResp.Insert(1, NumNO);
            int NumPARC = (from NoContr in agenteBD.ControlesEmpresaEstablecer
                           where NoContr.IdEmpresa == IdEmpresa && NoContr.Valor == "PARC"
                           select NoContr).Count();
            NumContrResp.Insert(2, NumPARC);
            int NumNA = (from NoContr in agenteBD.ControlesEmpresaEstablecer
                         where NoContr.IdEmpresa == IdEmpresa && NoContr.Valor == "N/A"
                         select NoContr).Count();
            NumContrResp.Insert(3, NumNA);
            return NumContrResp;
        }

        //Devuelve un conjunto de los controles asociados a una empresa según la respuesta
        public static IQueryable<ControlesEmpresa> RecogeControlesEmpresaResp(int IdEmpresa, String Parametro)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<ControlesEmpresa> ControlesEmpresaResp = from ContrEmpRes in agenteBD.ControlesEmpresaEstablecer
                                                                where ContrEmpRes.IdEmpresa == IdEmpresa && ContrEmpRes.Valor == Parametro
                                                                select ContrEmpRes;
            return ControlesEmpresaResp;
        }

        //Devuelve un conjunto de los controles de una empresa según el objetivo de control
        public static IQueryable<ControlesEmpresa> RecogeControlesEmpresaObjCtr(int IdEmpresa, String Parametro)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<ControlesEmpresa> ControlesEmpresaResp = from ContrEmpRes in agenteBD.ControlesEmpresaEstablecer
                                                                join Ctr in agenteBD.ControlesEstablecer on ContrEmpRes.IdControl equals Ctr.IdControl
                                                                join ObjCtr in agenteBD.ObjetivosControlEstablecer on Ctr.IdObjControl equals ObjCtr.IdObjControl
                                                                where ContrEmpRes.IdEmpresa == IdEmpresa && ObjCtr.Nombre == Parametro
                                                                select ContrEmpRes;
            return ControlesEmpresaResp;
        }

        //Permite actualizar el valor (respuesta) de un control de una empresa
        public static void ActulizaControlEmpresa(int IdEmpresa, int IdControl, String Valor)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            var ControlEmpresa = (from CtrEmp in agenteBD.ControlesEmpresaEstablecer
                                  where CtrEmp.IdControl == IdControl && CtrEmp.IdEmpresa == IdEmpresa
                                  select CtrEmp).Single();
            ControlEmpresa.Valor = Valor;
            agenteBD.SaveChanges();
        }

        //Devuelve el conjunto de los controles asociados a una empresa
        public static IQueryable<ControlesEmpresa> RecogeControlesEmpresa(int IdEmpresa)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<ControlesEmpresa> ValoresControlesEmpresa = from CtrEmp in agenteBD.ControlesEmpresaEstablecer
                                                                   where CtrEmp.IdEmpresa == IdEmpresa
                                                                   select CtrEmp;
            return ValoresControlesEmpresa;
        }

        //Devuelve una lista del número de controles agrupados por la respuesta de una empresa según un objetivo de control dado
        public static List<int> RecogeRespControlObjControl(int IdEmpresa, int IdObjControlActual)
        {
            int NumCtrlSI = 0;
            int NumCtrlNO = 0;
            int NumCtrlPARC = 0;
            int NumCtrlNA = 0;
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<String> ControlesObjControl = from ContrEmp in agenteBD.ControlesEmpresaEstablecer
                                                     join Contr in agenteBD.ControlesEstablecer on ContrEmp.IdControl equals Contr.IdControl
                                                     where Contr.IdObjControl == IdObjControlActual && ContrEmp.IdEmpresa == IdEmpresa
                                                     select ContrEmp.Valor;
            foreach (String ValorControl in ControlesObjControl)
            {
                switch (ValorControl.Trim())
                {
                    case "SI":
                        NumCtrlSI++;
                        break;
                    case "NO":
                        NumCtrlNO++;
                        break;
                    case "PARC":
                        NumCtrlPARC++;
                        break;
                    case "N/A":
                        NumCtrlNA++;
                        break;
                }
            }
            //[0]SI [1]NO [2]PARC [3]N/A
            List<int> LRespContrObjControl = new List<int>(4);
            LRespContrObjControl[0] = NumCtrlSI;
            LRespContrObjControl[1] = NumCtrlNO;
            LRespContrObjControl[2] = NumCtrlPARC;
            LRespContrObjControl[3] = NumCtrlNA;
            return LRespContrObjControl;

        }

        //Devuelve la respuesta de una empresa a un control
        public static String ValorControl(int IdEmpresa, int IdControl)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<String> ValorControl = from ContrEmp in agenteBD.ControlesEmpresaEstablecer
                                              where ContrEmp.IdControl == IdControl && ContrEmp.IdEmpresa == IdEmpresa
                                              select ContrEmp.Valor;
            if (ValorControl.Count() == 0)
            {
                return "Desconocido";
            }
            else
            {
                switch (ValorControl.First().Trim())
                {
                    case "SI":
                        return "Sí";
                    case "NO":
                        return "No";
                    case "PARC":
                        return "Parcialmente";
                    case "N/A":
                        return "No Aplica";
                    default:
                        return "Opcion no recogida";
                }
            }

        }

        //Método que formatea los valores almacenados en el campo Control para mostrarlo en informes y tablas
        public static String FormateaValorControlEmpresa(String Control)
        {
            switch (Control.Trim())
            {
                case "SI":
                    return "Sí";
                case "NO":
                    return "No";
                case "PARC":
                    return "Parcialmente";
                case "N/A":
                    return "No Aplica";
                default:
                    return "Sin Valor";
            }
        }

        //Método que devuelve si una empresa tiene contorles de la ISO-27002 ascoiados a ella
        public static bool TieneControlesEmpresa(int EmpresaUsuario)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            bool tiene = false;
            IQueryable<ControlesEmpresa> ContrEmpresa = from ContrEmp in agenteBD.ControlesEmpresaEstablecer
                                                        where ContrEmp.IdEmpresa == EmpresaUsuario
                                                        select ContrEmp;
            if (ContrEmpresa.Count() != 0)
                tiene = true;
            return tiene;
        }

        //Método que elimina de forma física todas los controles asociados a una empresa
        internal static void EliminaTotalControles(int IdEmpresa)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<ControlesEmpresa> ControlesEliminarQuery = from ContrEmp in agenteBD.ControlesEmpresaEstablecer
                                                                  where ContrEmp.IdEmpresa == IdEmpresa
                                                                  select ContrEmp;
            if (ControlesEliminarQuery.Count() != 0)
            {
                foreach (ControlesEmpresa Contr in ControlesEliminarQuery)
                {
                    agenteBD.ControlesEmpresaEstablecer.DeleteObject(Contr);
                }
                agenteBD.SaveChanges();
            }
        }

        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//

        //Método que inserta un control
        public static void InsertaControlEmpresa(int IdEmpresa, int IdControl, string ValorControl)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            ControlesEmpresa ControlInsertar = new ControlesEmpresa(IdEmpresa, IdControl, ValorControl);
            agenteBD.AddToControlesEmpresaEstablecer(ControlInsertar);
            agenteBD.SaveChanges();
        }
    }
}
